#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

static void *fun(void *arg);

int main(void)
{
    pthread_t tid;
    int err, i = 0;

    err = pthread_create(&tid, NULL, fun, NULL);

    if (err) { // 创建出错了
        fprintf(stderr, "create %s", strerror(err));
        return 1;
    }

    while (1) {
        if (i++ > 10) 
            break;
        fprintf(stdout, "!");
        fflush(stdout);
        sleep(1);
    }

    pthread_cancel(tid);

    return 0;
}

static void *fun(void *arg)
{
    int i = 0;

    while (1) {
        if (i++ > 5)
            break;
        fprintf(stdout, "*");
        fflush(stdout);
        sleep(1);
    }

    // 如果一个线程是可以撤销的，它的撤销类型是延迟的，
    // 一个撤销请求对那个线程还是未决的，然后当它调用一个撤销点时线程被撤销。
    sleep(15); // 撤销点函数

    printf("fun exit\n");

    return (void *)0;

}


